#!/bin/bash

# APK签名密钥生成脚本
# 用于生成Android应用签名所需的keystore文件

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印带颜色的消息
print_message() {
    echo -e "${2}${1}${NC}"
}

print_success() {
    print_message "$1" "$GREEN"
}

print_error() {
    print_message "$1" "$RED"
}

print_warning() {
    print_message "$1" "$YELLOW"
}

print_info() {
    print_message "$1" "$BLUE"
}

# 检查Java环境
check_java() {
    if ! command -v keytool &> /dev/null; then
        print_error "错误: 未找到keytool命令，请确保已安装Java JDK"
        exit 1
    fi
    
    java_version=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2)
    print_info "检测到Java版本: $java_version"
}

# 获取用户输入
get_user_input() {
    print_info "==== Android APK签名密钥生成器 ===="
    echo
    
    # 应用信息
    read -p "应用名称 (默认: jiazhuang_flutter_base): " APP_NAME
    APP_NAME=${APP_NAME:-jiazhuang_flutter_base}
    
    read -p "公司/组织名称 (默认: Example Company): " COMPANY_NAME
    COMPANY_NAME=${COMPANY_NAME:-"Example Company"}
    
    read -p "国家代码 (默认: CN): " COUNTRY_CODE
    COUNTRY_CODE=${COUNTRY_CODE:-CN}
    
    read -p "省份 (默认: Beijing): " STATE
    STATE=${STATE:-Beijing}
    
    read -p "城市 (默认: Beijing): " CITY
    CITY=${CITY:-Beijing}
    
    # 密钥信息
    read -p "Keystore别名 (默认: ${APP_NAME}_key): " KEY_ALIAS
    KEY_ALIAS=${KEY_ALIAS:-"${APP_NAME}_key"}
    
    read -p "密钥有效期(年) (默认: 25): " VALIDITY_YEARS
    VALIDITY_YEARS=${VALIDITY_YEARS:-25}
    
    # 密码
    while true; do
        read -s -p "Keystore密码: " KEYSTORE_PASSWORD
        echo
        read -s -p "确认Keystore密码: " KEYSTORE_PASSWORD_CONFIRM
        echo
        
        if [ "$KEYSTORE_PASSWORD" = "$KEYSTORE_PASSWORD_CONFIRM" ]; then
            break
        else
            print_error "密码不匹配，请重新输入"
        fi
    done
    
    while true; do
        read -s -p "密钥密码: " KEY_PASSWORD
        echo
        read -s -p "确认密钥密码: " KEY_PASSWORD_CONFIRM
        echo
        
        if [ "$KEY_PASSWORD" = "$KEY_PASSWORD_CONFIRM" ]; then
            break
        else
            print_error "密码不匹配，请重新输入"
        fi
    done
}

# 生成密钥
generate_keystore() {
    KEYSTORE_DIR="android/app"
    KEYSTORE_NAME="${APP_NAME}_release.keystore"
    KEYSTORE_PATH="${KEYSTORE_DIR}/${KEYSTORE_NAME}"
    
    # 确保目录存在
    mkdir -p "$KEYSTORE_DIR"
    
    # 检查是否已存在keystore
    if [ -f "$KEYSTORE_PATH" ]; then
        print_warning "Keystore文件已存在: $KEYSTORE_PATH"
        read -p "是否覆盖? (y/N): " OVERWRITE
        if [[ ! $OVERWRITE =~ ^[Yy]$ ]]; then
            print_info "操作已取消"
            exit 0
        fi
        rm -f "$KEYSTORE_PATH"
    fi
    
    print_info "正在生成Keystore..."
    
    # 生成keystore
    keytool -genkey \
        -v \
        -keystore "$KEYSTORE_PATH" \
        -keyalg RSA \
        -keysize 2048 \
        -validity $((VALIDITY_YEARS * 365)) \
        -alias "$KEY_ALIAS" \
        -storepass "$KEYSTORE_PASSWORD" \
        -keypass "$KEY_PASSWORD" \
        -dname "CN=$COMPANY_NAME, OU=$APP_NAME, O=$COMPANY_NAME, L=$CITY, S=$STATE, C=$COUNTRY_CODE"
    
    if [ $? -eq 0 ]; then
        print_success "✓ Keystore生成成功: $KEYSTORE_PATH"
    else
        print_error "✗ Keystore生成失败"
        exit 1
    fi
}

# 生成key.properties文件
generate_key_properties() {
    KEY_PROPERTIES_PATH="android/key.properties"
    
    print_info "正在生成key.properties文件..."
    
    cat > "$KEY_PROPERTIES_PATH" << EOF
# Android签名配置
# 此文件包含敏感信息，不应提交到版本控制
storePassword=$KEYSTORE_PASSWORD
keyPassword=$KEY_PASSWORD
keyAlias=$KEY_ALIAS
storeFile=$KEYSTORE_NAME
EOF
    
    print_success "✓ key.properties文件生成成功: $KEY_PROPERTIES_PATH"
}

# 显示密钥信息
show_keystore_info() {
    print_info "==== 密钥信息 ===="
    keytool -list -v -keystore "$KEYSTORE_PATH" -storepass "$KEYSTORE_PASSWORD"
}

# 生成配置说明
generate_instructions() {
    INSTRUCTIONS_FILE="android/SIGNING_INSTRUCTIONS.md"
    
    cat > "$INSTRUCTIONS_FILE" << EOF
# Android APK签名配置说明

## 文件说明

### 1. Keystore文件
- **位置**: \`android/app/${KEYSTORE_NAME}\`
- **用途**: 用于签名发布版本的APK
- **重要性**: 此文件非常重要，丢失将无法更新应用

### 2. Key Properties文件
- **位置**: \`android/key.properties\`
- **用途**: 存储签名配置信息
- **安全性**: 包含敏感信息，已加入.gitignore

## 使用方法

### 构建签名APK
\`\`\`bash
# 使用Flutter命令
flutter build apk --release

# 或使用脚本
./scripts/build_apk.sh
\`\`\`

### 构建App Bundle (推荐)
\`\`\`bash
# 使用Flutter命令
flutter build appbundle --release

# 或使用脚本
./scripts/build_appbundle.sh
\`\`\`

## 重要注意事项

1. **备份密钥**: 请务必备份keystore文件和密码
2. **密码安全**: 不要将密码提交到版本控制
3. **密钥一致性**: 应用更新必须使用相同的密钥签名
4. **Google Play**: 推荐使用App Bundle格式上传到Google Play

## 密钥信息

- **应用名称**: $APP_NAME
- **密钥别名**: $KEY_ALIAS
- **有效期**: $VALIDITY_YEARS 年
- **生成时间**: $(date)

## 故障排除

如果遇到签名问题，请检查：
1. key.properties文件是否存在且配置正确
2. keystore文件是否存在
3. 密码是否正确
4. Android Gradle Plugin版本是否支持

EOF

    print_success "✓ 配置说明文件生成成功: $INSTRUCTIONS_FILE"
}

# 主函数
main() {
    print_info "开始生成Android APK签名密钥..."
    
    check_java
    get_user_input
    generate_keystore
    generate_key_properties
    generate_instructions
    
    echo
    print_success "==== 密钥生成完成 ===="
    print_info "文件列表:"
    echo "  - $KEYSTORE_PATH"
    echo "  - android/key.properties"
    echo "  - android/SIGNING_INSTRUCTIONS.md"
    echo
    print_warning "重要提醒:"
    echo "  1. 请备份keystore文件和密码"
    echo "  2. key.properties文件包含敏感信息，不要提交到Git"
    echo "  3. 查看SIGNING_INSTRUCTIONS.md了解详细使用说明"
    echo
    
    read -p "是否查看密钥详细信息? (y/N): " SHOW_INFO
    if [[ $SHOW_INFO =~ ^[Yy]$ ]]; then
        show_keystore_info
    fi
}

# 检查是否在Flutter项目根目录
if [ ! -f "pubspec.yaml" ]; then
    print_error "错误: 请在Flutter项目根目录运行此脚本"
    exit 1
fi

# 运行主函数
main "$@"